/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-06-16
 * Time: 23:00
 */
public class Solution {
    public int rangeBitwiseAnd(int left, int right) {
//         从 left 到 right 中
//         先取出 left 和 right 相同的前缀
//         那么相同前缀后面的位最后均为 0
//         因为 [left, right] 中除 left 和 right 的相同前缀位之外的位都是前面的实数中是 0, 后面的是 1
//         因为 这个区间是连续的
//         所以最终的目的就变成了 求 left 和 right 的最长相同前缀
//         当然可以使用移位, 但是 使用  n & (n-1), 可以将 n 最右边的 1 去除, 加快了速度
//         注意这里面的判断条件不是 相等, 而是 left < right, 因为我们只 变化了 right
        while (right > left) {
            right = (right & (right - 1));
        }
        return right;
    }
}
